package ma.co.ba.BusinessApplications.presentation.controllers.utilisateurs;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import ma.co.ba.BusinessApplications.business.commons.CommonBusiness;
import ma.co.ba.BusinessApplications.business.groupes.GroupeBusiness;
import ma.co.ba.BusinessApplications.business.profils.ProfilBusiness;
import ma.co.ba.BusinessApplications.business.utilisateurs.UtilisateurBusiness;
import ma.co.ba.BusinessApplications.model.Groupe;
import ma.co.ba.BusinessApplications.model.Profil;
import ma.co.ba.BusinessApplications.model.Utilisateur;
import ma.co.ba.BusinessApplications.presentation.components.GroupeEditor;
import ma.co.ba.BusinessApplications.presentation.components.ProfilEditor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;

@Controller
@RequestMapping("/utilisateurs")
public class UtilisateurController {
	@Autowired
	CommonBusiness commonBusiness;
	@Autowired
	UtilisateurBusiness utilisateurBusiness;
	@Autowired
	GroupeBusiness groupeBusiness;
	@Autowired
	ProfilBusiness profilBusiness;
	@Autowired
	GroupeEditor groupeEditor;
	@Autowired
	ProfilEditor profilEditor;

	// ConsultantFormValidator consultantFormValidator;
	// @Autowired
	// public ConsultantController(ConsultantFormValidator
	// consultantFormValidator){
	// this.consultantFormValidator = consultantFormValidator;
	// }

	@InitBinder
	public void initBinder(WebDataBinder binder) {
		// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		// binder.registerCustomEditor(Date.class, new
		// CustomDateEditor(dateFormat,true));
		binder.registerCustomEditor(Groupe.class, this.groupeEditor);
		binder.registerCustomEditor(Profil.class, this.profilEditor);
	}

	@RequestMapping(value = "/retour", method = RequestMethod.GET)
	public String retourUtilisateurPage(ModelMap model) {
		return "redirect:/utilisateurs";
	}

	@RequestMapping(value = "/update", method = RequestMethod.GET)
	public String updateUtilisateurPage(ModelMap model,
			@RequestParam("id") int utilisateurId,
			@ModelAttribute("newUser") Utilisateur newUser) {
		Utilisateur upUser = utilisateurBusiness
				.getUtilisateurById(utilisateurId);
		model.addAttribute("upUser", upUser);
		return "utilisateurUpdate";
	}

	@RequestMapping(value = "/update", method = RequestMethod.POST)
	public String updateUtilisateurSubmit(ModelMap model,
			@ModelAttribute("user") Utilisateur user) {

		Utilisateur oldUser = utilisateurBusiness.getUtilisateurById(user
				.getId());
		oldUser.setMatricule(user.getMatricule());
		oldUser.setPrenom(user.getPrenom());
		oldUser.setNom(user.getNom());
		oldUser.setEmail(user.getEmail());
		oldUser.setGsm(user.getGsm());
		commonBusiness.updateEntity(oldUser);
		return "redirect:/utilisateurs";
	}

	@RequestMapping(method = RequestMethod.GET)
	public String utilisateursPage(ModelMap model,
			@ModelAttribute("newUser") Utilisateur newUser) {

		// // return form view
		return "utilisateurs";
	}

	@RequestMapping(value = "/delete", method = RequestMethod.GET)
	public String deleteUtilisateur(ModelMap model,
			@RequestParam("id") int utilisateurId) {

		// Utilisateur usr =
		// utilisateurBusiness.getUtilisateurById(utilisateurId);
		// commonBusiness.deleteEntity(usr);
		utilisateurBusiness.disableUtilisateur(utilisateurId);

		// // return form view
		return "redirect:/utilisateurs";
	}

	@RequestMapping(method = RequestMethod.POST)
	public String processSubmit(@ModelAttribute("newUser") Utilisateur newUser,
			BindingResult result, SessionStatus status) {

		newUser.setNomComplet(newUser.getNom() + " " + newUser.getPrenom());
		utilisateurBusiness.saveUtilisateur(newUser);
		return "redirect:utilisateurs";

	}

	@ModelAttribute("newUser")
	public Utilisateur getNewUser() {
		return new Utilisateur();
	}

	@ModelAttribute("consultantsList")
	public List<Utilisateur> getConsultantsList() {
		List<Utilisateur> consultantsList = null;
		consultantsList = utilisateurBusiness.getActiveConsultants();
		return consultantsList;
	}

	@ModelAttribute("groupeList")
	public Map<String, String> getGroupeList() {
		List<Groupe> groupes = null;
		groupes = groupeBusiness.getGroupeList();

		Map<String, String> groupeList = new HashMap<String, String>();
		if (groupes != null) {
			for (Groupe groupe : groupes) {
				groupeList.put(groupe.getId() + "", groupe.getLibelleGroupe());
			}
		}
		return groupeList;
	}

	@ModelAttribute("directeursList")
	public List<Utilisateur> getDirecteursList() {
		List<Utilisateur> directeursList = utilisateurBusiness
				.getActiveDirecteurs();
		return directeursList;
	}

	@ModelAttribute("responsablesList")
	public List<Utilisateur> getResponsablesList() {
		List<Utilisateur> responsablesList = utilisateurBusiness
				.getActiveResponsables();
		return responsablesList;
	}

	@ModelAttribute("profilsList")
	public List<Profil> profilsList() {
		List<Profil> profilsList = null;
		profilsList = profilBusiness.getAllProfils();

		// Map<String, String> profilsList = new HashMap<String, String>();
		// if (profils != null) {
		// for (Profil profil : profils) {
		// profilsList.put(profil.getId() + "", profil.getLibelleProfil());
		// }
		// }
		return profilsList;
	}

	// @ModelAttribute("javaSkillsList")
	// public Map<String,String> populateJavaSkillList() {
	// //Data referencing for java skills list box
	// Map<String,String> javaSkill = new LinkedHashMap<String,String>();
	// javaSkill.put("Hibernate", "Hibernate");
	// javaSkill.put("Spring", "Spring");
	// javaSkill.put("Apache Wicket", "Apache Wicket");
	// javaSkill.put("Struts", "Struts");
	// return javaSkill;
	// }

	// @ModelAttribute("countryList")
	// public Map<String,String> populateCountryList() {
	// //Data referencing for java skills list box
	// Map<String,String> country = new LinkedHashMap<String,String>();
	// country.put("US", "United Stated");
	// country.put("CHINA", "China");
	// country.put("SG", "Singapore");
	// country.put("MY", "Malaysia");
	// return country;
	// }

	@ModelAttribute("utilisateurs")
	public List<Utilisateur> getUtilisateurs() {
		List<Utilisateur> utilisateurs = utilisateurBusiness
				.getAllConsultants();
		return utilisateurs;
	}
}